#include "timer.h"

/**
 * @brief       定时器1初始化（向上计数）
 * @param       psr：预分频值，arr：重装载值
 * @retval      NULL
 */
void timer1_init(u16 psr, u16 arr)
{
	TIM_TimeBaseInitTypeDef tim_time_base_init_structure;						
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);								
	TIM_InternalClockConfig(TIM1);																			
	
	tim_time_base_init_structure.TIM_ClockDivision = TIM_CKD_DIV1;			//设置1分频（不分频）
	tim_time_base_init_structure.TIM_CounterMode = TIM_CounterMode_Up;	//设置计数模式为向上计数
	tim_time_base_init_structure.TIM_Period = arr;											//设置最大计数值，达到最大值触发更新事件，从0开始计数
	tim_time_base_init_structure.TIM_Prescaler = psr;										//设置时钟预分频
	tim_time_base_init_structure.TIM_RepetitionCounter = 0;							//重复计数器
	TIM_TimeBaseInit(TIM1, &tim_time_base_init_structure);							//初始化TIM1定时器
	
	TIM_ClearFlag(TIM1, TIM_FLAG_Update);																//清除更新中断标志位
	TIM_ITConfig(TIM1, TIM_IT_Update|TIM_IT_Trigger, ENABLE);						//开启更新中断
	
	NVIC_InitTypeDef nvic_init_structure;																//定义结构体，配置中断优先级
	nvic_init_structure.NVIC_IRQChannel = TIM1_UP_IRQn;									//指定中断通道
	nvic_init_structure.NVIC_IRQChannelCmd = ENABLE;										//中断使能
	nvic_init_structure.NVIC_IRQChannelPreemptionPriority = 2;					//设置抢占优先级
	nvic_init_structure.NVIC_IRQChannelSubPriority = 2;									//设置响应优先级
	NVIC_Init(&nvic_init_structure);
	
	TIM_Cmd(TIM1, ENABLE);
}

/**
* @brief       定时器3初始化（向上计数）
 * @param       psr：预分频值，arr：重装载值
 * @retval      NULL
 */
void timer3_init(u16 psr, u16 arr)
{
	TIM_TimeBaseInitTypeDef tim_time_base_init_structure;				
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);								
	TIM_InternalClockConfig(TIM3);																			
	
	tim_time_base_init_structure.TIM_ClockDivision = TIM_CKD_DIV1;			//设置1分频（不分频）
	tim_time_base_init_structure.TIM_CounterMode = TIM_CounterMode_Up;	//设置计数模式为向上计数
	tim_time_base_init_structure.TIM_Period = arr;											//设置最大计数值，达到最大值触发更新事件，从0开始计数
	tim_time_base_init_structure.TIM_Prescaler = psr;										//设置时钟预分频
	tim_time_base_init_structure.TIM_RepetitionCounter = 0;							//重复计数器（高级定时器才有，所以设置0）
	TIM_TimeBaseInit(TIM3, &tim_time_base_init_structure);							//初始化TIM3定时器
	
	TIM_ClearFlag(TIM3, TIM_FLAG_Update);																//清除更新中断标志位
	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);													//开启更新中断
	
	NVIC_InitTypeDef nvic_init_structure;																//定义结构体，配置中断优先级
	nvic_init_structure.NVIC_IRQChannel = TIM3_IRQn;										//指定中断通道
	nvic_init_structure.NVIC_IRQChannelCmd = ENABLE;										//中断使能
	nvic_init_structure.NVIC_IRQChannelPreemptionPriority = 2;					//设置抢占优先级
	nvic_init_structure.NVIC_IRQChannelSubPriority = 2;									//设置响应优先级
	NVIC_Init(&nvic_init_structure);
	
	TIM_Cmd(TIM3, ENABLE);
}
